{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python 3.7.0 (default, Oct  7 2018, 13:03:13) \n",
      "[GCC 7.3.0]\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print('Python {}'.format(sys.version))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<zlmdb._database.Database object at 0x7f4104fef4a8>\n"
     ]
    }
   ],
   "source": [
    "# attach to crossbar event store\n",
    "import zlmdb\n",
    "from cfxdb.schema import Schema\n",
    "\n",
    "# when running notebook inside docker\n",
    "DBFILE = '../testdb'\n",
    "\n",
    "# when running notebook directly on host\n",
    "DBFILE = '../../crossbar/.testdb'\n",
    "\n",
    "db = zlmdb.Database(DBFILE, maxsize=2**30, readonly=True)\n",
    "\n",
    "schema = Schema.attach(db)\n",
    "\n",
    "print(db)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "processed 10000 records ..\n",
      "processed 20000 records ..\n",
      "processed 30000 records ..\n",
      "processed 40000 records ..\n",
      "processed 50000 records ..\n",
      "finished: collected vectors of length 54329\n"
     ]
    }
   ],
   "source": [
    "vec_x = []\n",
    "vec_y = []\n",
    "vec_category = []\n",
    "vec_value2 = []\n",
    "\n",
    "map_categories = {'null': 0, 'alert': 1, 'warning': 2, 'info': 3, 'ad': 4, 'other': 5}\n",
    "\n",
    "with db.begin() as txn:\n",
    "    i = 0\n",
    "    # query event store and get geo events ..\n",
    "    for evt in schema.publications.select(txn, limit=1000000-1, return_keys=False):\n",
    "        if evt.topic.startswith('com.example.geoservice.'):\n",
    "            e = evt.args[0]\n",
    "            vec_x.append(e['x'])\n",
    "            vec_y.append(e['y'])\n",
    "            vec_category.append(map_categories.get(e['category'], 0))\n",
    "            vec_value2.append(e['value2'])\n",
    "        i += 1\n",
    "        if i % 10000 == 0:\n",
    "            print('processed {} records ..'.format(i))\n",
    "\n",
    "print('finished: collected vectors of length {}'.format(len(vec_x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "      <th>category</th>\n",
       "      <th>value2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>54329.000000</td>\n",
       "      <td>54329.000000</td>\n",
       "      <td>54329.000000</td>\n",
       "      <td>54329.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>50.030315</td>\n",
       "      <td>49.924442</td>\n",
       "      <td>3.004878</td>\n",
       "      <td>0.501813</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>29.215132</td>\n",
       "      <td>29.066145</td>\n",
       "      <td>1.416553</td>\n",
       "      <td>0.288219</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>25.000000</td>\n",
       "      <td>25.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.251303</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>50.000000</td>\n",
       "      <td>50.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>0.503480</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>75.000000</td>\n",
       "      <td>75.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.752717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>100.000000</td>\n",
       "      <td>100.000000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>0.999982</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  x             y      category        value2\n",
       "count  54329.000000  54329.000000  54329.000000  54329.000000\n",
       "mean      50.030315     49.924442      3.004878      0.501813\n",
       "std       29.215132     29.066145      1.416553      0.288219\n",
       "min        0.000000      0.000000      1.000000      0.000008\n",
       "25%       25.000000     25.000000      2.000000      0.251303\n",
       "50%       50.000000     50.000000      3.000000      0.503480\n",
       "75%       75.000000     75.000000      4.000000      0.752717\n",
       "max      100.000000    100.000000      5.000000      0.999982"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "# create pandas dataframe from data collected in lists\n",
    "df = pd.DataFrame({\n",
    "    'x': np.asarray(vec_x, dtype='uint16'),\n",
    "    'y': np.asarray(vec_y, dtype='uint16'),\n",
    "    'category': np.asarray(vec_category, dtype='uint8'),\n",
    "    'value2': np.asarray(vec_value2, dtype='float32')\n",
    "})\n",
    "\n",
    "# compute some basic statistics\n",
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/oberstet/cpy370_1/lib/python3.7/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.\n",
      "  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<seaborn.axisgrid.JointGrid at 0x7f40bc0d9710>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x432 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import seaborn as sns\n",
    "\n",
    "# scatterplot of the first 100 data points\n",
    "sns.jointplot(data=df[:100], x='x', y='y', kind='scatter', color='r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>y</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>x</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.501208</td>\n",
       "      <td>0.509216</td>\n",
       "      <td>0.513635</td>\n",
       "      <td>0.479069</td>\n",
       "      <td>0.500698</td>\n",
       "      <td>0.516006</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.505820</td>\n",
       "      <td>0.499166</td>\n",
       "      <td>0.511938</td>\n",
       "      <td>0.526053</td>\n",
       "      <td>0.512123</td>\n",
       "      <td>0.521450</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.499674</td>\n",
       "      <td>0.510251</td>\n",
       "      <td>0.497012</td>\n",
       "      <td>0.501565</td>\n",
       "      <td>0.483123</td>\n",
       "      <td>0.531975</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.500024</td>\n",
       "      <td>0.503853</td>\n",
       "      <td>0.502365</td>\n",
       "      <td>0.512313</td>\n",
       "      <td>0.496125</td>\n",
       "      <td>0.566534</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.495139</td>\n",
       "      <td>0.515034</td>\n",
       "      <td>0.494750</td>\n",
       "      <td>0.497092</td>\n",
       "      <td>0.504172</td>\n",
       "      <td>0.540792</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.572624</td>\n",
       "      <td>0.459266</td>\n",
       "      <td>0.479113</td>\n",
       "      <td>0.578355</td>\n",
       "      <td>0.523372</td>\n",
       "      <td>0.299809</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "y         0         1         2         3         4         5\n",
       "x                                                            \n",
       "0  0.501208  0.509216  0.513635  0.479069  0.500698  0.516006\n",
       "1  0.505820  0.499166  0.511938  0.526053  0.512123  0.521450\n",
       "2  0.499674  0.510251  0.497012  0.501565  0.483123  0.531975\n",
       "3  0.500024  0.503853  0.502365  0.512313  0.496125  0.566534\n",
       "4  0.495139  0.515034  0.494750  0.497092  0.504172  0.540792\n",
       "5  0.572624  0.459266  0.479113  0.578355  0.523372  0.299809"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# compute truncated dataset\n",
    "import math\n",
    "\n",
    "def trunc(val):\n",
    "    return int(val / 20)\n",
    "\n",
    "df3 = pd.DataFrame({\n",
    "    'x': df['x'].apply(trunc),\n",
    "    'y': df['y'].apply(trunc),\n",
    "    'value': df['value2'],\n",
    "})\n",
    "\n",
    "# compute aggregate\n",
    "df4 = df3.pivot_table(index='x', columns='y', values='value', aggfunc=np.median)\n",
    "\n",
    "df4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f409af5b6d8>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot heatmap of truncated/aggregated data\n",
    "sns.heatmap(df4, annot=True, fmt=\".3f\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
